home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 3.iso / dist / fw_qt3.idb / usr / freeware / Qt / examples / aclock / aclock.cpp.z / aclock.cpp
C/C++ Source or Header  |  2002-04-08  |  3KB  |  140 lines

  1. /****************************************************************************
  2. ** $Id:  qt/aclock.cpp   3.0.3   edited Oct 12 12:18 $
  3. **
  4. ** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
  5. **
  6. ** This file is part of an example program for Qt.  This example
  7. ** program may be used, distributed and modified without limitation.
  8. **
  9. *****************************************************************************/
  10.  
  11. #include "aclock.h"
  12. #include <qtimer.h>
  13. #include <qpainter.h>
  14. #include <qbitmap.h>
  15.  
  16. //
  17. // Constructs an analog clock widget that uses an internal QTimer.
  18. //
  19.  
  20. AnalogClock::AnalogClock( QWidget *parent, const char *name )
  21.     : QWidget( parent, name )
  22. {
  23.     time = QTime::currentTime();        // get current time
  24.     QTimer *internalTimer = new QTimer( this );    // create internal timer
  25.     connect( internalTimer, SIGNAL(timeout()), SLOT(timeout()) );
  26.     internalTimer->start( 5000 );        // emit signal every 5 seconds
  27. }
  28.  
  29. void AnalogClock::mousePressEvent( QMouseEvent *e )
  30. {
  31.     if(isTopLevel()) 
  32.     clickPos = e->pos() + QPoint(geometry().topLeft() - frameGeometry().topLeft());
  33. }
  34.  
  35. void AnalogClock::mouseMoveEvent( QMouseEvent *e )
  36. {
  37.     if(isTopLevel())
  38.     move( e->globalPos() - clickPos );
  39. }
  40.  
  41. void AnalogClock::setTime( const QTime & t )
  42. {
  43.     time = t;
  44.     timeout();
  45. }
  46.  
  47. //
  48. // The QTimer::timeout() signal is received by this slot.
  49. //
  50.  
  51. void AnalogClock::timeout()
  52. {
  53.     QTime new_time = QTime::currentTime();    // get the current time
  54.     time = time.addSecs( 5 );
  55.     if ( new_time.minute() != time.minute() ) {    // minute has changed
  56.     if (autoMask())
  57.         updateMask();
  58.     else
  59.         update();
  60.     }
  61. }
  62.  
  63.  
  64. void AnalogClock::paintEvent( QPaintEvent * )
  65. {
  66.     if ( autoMask() )
  67.     return;
  68.     QPainter paint( this );
  69.     paint.setBrush( colorGroup().foreground() );
  70.     drawClock( &paint );
  71. }
  72.  
  73. // If the clock is transparent, we use updateMask()
  74. // instead of paintEvent()
  75.  
  76. void AnalogClock::updateMask()    // paint clock mask
  77. {
  78.     QBitmap bm( size() );
  79.     bm.fill( color0 );            //transparent
  80.  
  81.     QPainter paint;
  82.     paint.begin( &bm, this );
  83.     paint.setBrush( color1 );        // use non-transparent color
  84.     paint.setPen( color1 );
  85.  
  86.     drawClock( &paint );
  87.  
  88.     paint.end();
  89.     setMask( bm );
  90. }
  91.  
  92. //
  93. // The clock is painted using a 1000x1000 square coordinate system, in
  94. // the a centered square, as big as possible.  The painter's pen and
  95. // brush colors are used.
  96. //
  97. void AnalogClock::drawClock( QPainter *paint )
  98. {
  99.     paint->save();
  100.     
  101.     paint->setWindow( -500,-500, 1000,1000 );
  102.  
  103.     QRect v = paint->viewport();
  104.     int d = QMIN( v.width(), v.height() );
  105.     paint->setViewport( v.left() + (v.width()-d)/2,
  106.             v.top() + (v.height()-d)/2, d, d );
  107.  
  108.     // time = QTime::currentTime();
  109.     QPointArray pts;
  110.  
  111.     paint->save();
  112.     paint->rotate( 30*(time.hour()%12-3) + time.minute()/2 );
  113.     pts.setPoints( 4, -20,0,  0,-20, 300,0, 0,20 );
  114.     paint->drawConvexPolygon( pts );
  115.     paint->restore();
  116.  
  117.     paint->save();
  118.     paint->rotate( (time.minute()-15)*6 );
  119.     pts.setPoints( 4, -10,0, 0,-10, 400,0, 0,10 );
  120.     paint->drawConvexPolygon( pts );
  121.     paint->restore();
  122.  
  123.     for ( int i=0; i<12; i++ ) {
  124.     paint->drawLine( 440,0, 460,0 );
  125.     paint->rotate( 30 );
  126.     }
  127.  
  128.     paint->restore();
  129. }
  130.  
  131.  
  132. void AnalogClock::setAutoMask(bool b)
  133. {
  134.     if (b) 
  135.     setBackgroundMode( PaletteForeground );
  136.     else 
  137.     setBackgroundMode( PaletteBackground );
  138.     QWidget::setAutoMask(b);
  139. }
  140.